﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using DAL.Helpers;
using DAL.DTOs;
using System.Data.Linq.SqlClient;

namespace DAL.Modelos
{
    public class Modelo
    {
        private RepositorioDataContext repositorio = null;

        public Modelo()
        {
            repositorio = new RepositorioDataContext();
        }

        #region Obra Social

        /// <summary>
        /// Agregar nueva Obra Social pasandole un objeto 
        /// </summary>
        /// <param name="obraSocial">Objeto Entidad</param>
        /// <returns> MessageHelper contiene un estado (bool) y un mensaje</returns>
        public MessageHelper AddEntidad(Entidades_O_S__ obraSocial)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Entidades_O_S__s.InsertOnSubmit(obraSocial);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        /// <summary>
        /// Modifica Obra Social pasandole un objeto 
        /// </summary>
        /// <param name="obraSocial">Objeto Entidad</param>
        /// <returns> MessageHelper contiene un estado (bool) y un mensaje</returns>
        public MessageHelper UpdateEntidad(Entidades_O_S__ obraSocial)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var entidad = repositorio.Entidades_O_S__s.First(x => x.Codigo == obraSocial.Codigo);
                if (entidad != null)
                {
                    entidad.Denominacion = obraSocial.Denominacion;
                    entidad.Abreviatura = obraSocial.Abreviatura;
                    entidad.Direccion = obraSocial.Direccion;
                    entidad.CodPostal = obraSocial.CodPostal;
                    entidad.IdTipoEntidad = obraSocial.IdTipoEntidad;
                    entidad.IdCondicion = obraSocial.IdCondicion;
                    entidad.BajaLogica = obraSocial.BajaLogica;
                    repositorio.SubmitChanges();
                }

                return new MessageHelper() { status = true, message = "Modificación exitosa." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah modificado. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper VerificacionExistencia(decimal CodObraSocial)
        {
            try
            {
                repositorio = new RepositorioDataContext();

                var codObra = (from ObraSocial in repositorio.Entidades_O_S__s
                               where ObraSocial.Codigo == CodObraSocial
                               select ObraSocial.Codigo).FirstOrDefault();
                return codObra == CodObraSocial ? new MessageHelper() { status = true, message = "Existe la Obra Social." } :
                    new MessageHelper() { status = false, message = "No existe la Obra Social." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "Ha ocurrido un problema:\r\n" +
                        ex.Message
                };
            }
        }

        #endregion

        #region Persona

        public MessageHelper AddPersona(Persona persona)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Personas.InsertOnSubmit(persona);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper UpdatePersona(Persona persona)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var person = repositorio.Personas.First(x => x.Documento == persona.Documento);
                if (person != null)
                {
                    person.Apellido = persona.Apellido;
                    person.Nombres = persona.Nombres;
                    person.FechaNacimiento = persona.FechaNacimiento;
                    person.Sexo = persona.Sexo;
                    person.Celular = persona.Celular;
                    person.Direccion = persona.Direccion;
                    person.CodPostal = persona.CodPostal;
                    person.TelFijo = persona.TelFijo;
                    person.Email = persona.Email;
                    person.FechaCreacion = persona.FechaCreacion;
                    person.FechaModificacion = persona.FechaModificacion;
                    person.IdTipoPersona = persona.IdTipoPersona;
                    repositorio.SubmitChanges();

                }
                return new MessageHelper() { status = true, message = "Modificación exitosa." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah modificado. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper AddPrestador(Prestador prestador)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Prestadors.InsertOnSubmit(prestador);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper UpdatePrestador(Prestador prestador)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var prest = repositorio.Prestadors.First(x => x.CodFacturacion == prestador.CodFacturacion);
                if (prest != null)
                {
                    prest.Documento = prestador.Documento;
                    prest.Cuit = prestador.Cuit;
                    prest.Matricula = prestador.Matricula;
                    prest.Especialidad = prestador.Especialidad;
                    prest.FechaGraduacion = prestador.FechaGraduacion;
                    prest.FechaCreacion = prestador.FechaCreacion;
                    prest.FechaModificacion = prestador.FechaModificacion;
                    prest.IdCondicion = prestador.IdCondicion;
                    prest.BajaLogica = prestador.BajaLogica;
                    repositorio.SubmitChanges();
                }

                return new MessageHelper() { status = true, message = "Modificación exitosa." };

            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah modificado. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper VerificacionExistenciaPersona(decimal documento)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var doc = (from persona in repositorio.Personas
                           where persona.Documento == documento
                           select persona.Documento).FirstOrDefault();
                return doc == documento ? new MessageHelper() { status = true, message = "Existe el documento." } :
                    new MessageHelper() { status = false, message = "No existe el documento." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "Ha ocurrido un problema:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper VerificacionExistenciaPrestador(decimal codigo)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var cod = (from prestador in repositorio.Prestadors
                           where prestador.CodFacturacion == codigo
                           select prestador.CodFacturacion).FirstOrDefault();
                return cod == codigo ? new MessageHelper() { status = true, message = "Existe el Codigo de Facturación." } :
                    new MessageHelper() { status = false, message = "No existe el Codigo de Facturación." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "Ha ocurrido un problema:\r\n" +
                        ex.Message
                };
            }
        }

        public Prestador ConsultarPrestador(decimal codigo)
        {
            var prest = (from prestador in repositorio.Prestadors
                         where prestador.CodFacturacion == codigo
                         select prestador).FirstOrDefault();
            return prest;
        }

        public Persona ConsultarPersona(decimal dni)
        {
            var pers = (from persona in repositorio.Personas
                        where persona.Documento == dni
                        select persona).FirstOrDefault();
            return pers;
        }

        public CodigoDenominacion codigoDenominacion(int codigo)
        {
            try
            {
                var prest = (from prestador in repositorio.Prestadors
                             join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                             where prestador.CodFacturacion == codigo
                             select new CodigoDenominacion()
                             {
                                 Codigo = (int)prestador.CodFacturacion,
                                 Denominacion = persona.Apellido + " " + persona.Nombres
                             }).First();
                return prest;
            }
            catch (Exception ex)
            {
                return null;
            }
        }



        #endregion

        #region Debito

        public MessageHelper AddDebito(Debito debito)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Debitos.InsertOnSubmit(debito);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper UpdateDebito(Debito debito)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var Debito = repositorio.Debitos.First(x => x.Id == debito.Id);
                if (Debito != null)
                {
                    Debito.CodEntidad = debito.CodEntidad;
                    Debito.NOrden = debito.NOrden;
                    Debito.Ntransaccion = debito.Ntransaccion;
                    Debito.DocPaciente = debito.DocPaciente;
                    Debito.Paciente = debito.Paciente;
                    Debito.CodFacturacion = debito.CodFacturacion;
                    Debito.CodPractica = debito.CodPractica;
                    Debito.Honorarios = debito.Honorarios;
                    Debito.Gastos = debito.Gastos;
                    Debito.HonAcordado = debito.HonAcordado;
                    Debito.GtoAcordado = debito.GtoAcordado;
                    Debito.IdMotivoDebito = debito.IdMotivoDebito;
                    Debito.Observaciones = debito.Observaciones;
                    Debito.NFactura = debito.NFactura;
                    Debito.idTipoDebito = debito.idTipoDebito;
                    Debito.IdPeriodoDebito = debito.IdPeriodoDebito;


                    repositorio.SubmitChanges();
                }

                return new MessageHelper() { status = true, message = "Modificación exitosa." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah modificado. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper AddPeriodoDebito(PeriodoDebito periodo)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.PeriodoDebitos.InsertOnSubmit(periodo);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public bool VerificarPeriodoDebito(int mes, int anio)
        {
            var periodo = (from periodoDebito in repositorio.PeriodoDebitos
                           where periodoDebito.Mes == mes && periodoDebito.Anio == anio
                           select true).FirstOrDefault();
            return periodo;
        }

        public int PeriodoId(int mes, int anio)
        {
            var idPeriodo = (from periodoDebito in repositorio.PeriodoDebitos
                             where periodoDebito.Mes == mes && periodoDebito.Anio == anio
                             select periodoDebito.IdPeriodo).First();
            return idPeriodo;
        }

        public List<int> GetPeriodo(int idPeriodo)
        {
            var periodoM = (from periodoDebito in repositorio.PeriodoDebitos
                           where periodoDebito.IdPeriodo == idPeriodo
                           select periodoDebito.Mes).First();

            var periodoA = (from periodoDebito in repositorio.PeriodoDebitos
                            where periodoDebito.IdPeriodo == idPeriodo
                            select periodoDebito.Anio).First();

            var lista = new List<int>();
            lista.Add(periodoM);
            lista.Add(periodoA);

            return lista;
        }

        public MessageHelper AddMotivoDebito(MotivoDebito motivo)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.MotivoDebitos.InsertOnSubmit(motivo);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public bool VerificacionMotivoDebito(int idMotivo)
        {
            var verificacion = (from motivoDebito in repositorio.MotivoDebitos
                                where motivoDebito.IdMotivo == idMotivo
                                select true).FirstOrDefault();
            return verificacion;

        }

        public MotivoDebito ConsultarMotivoDebito(int id)
        {
            var mot = (from motivoDebito in repositorio.MotivoDebitos
                       where motivoDebito.IdMotivo == id
                       select motivoDebito).FirstOrDefault();
            return mot;
        }

        public MessageHelper AddFacturacion(Facturacion facturacion)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Facturacions.InsertOnSubmit(facturacion);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public bool VerificarFacturación(int numFactura)
        {
            var verificacion = (from facturacion in repositorio.Facturacions
                                where facturacion.NFactura == numFactura
                                select true).FirstOrDefault();
            return verificacion;
        }


        public int VerificacionPeriodoId(int mes, int anio)
        {
            var verificacion = (from periodoDebito in repositorio.PeriodoDebitos
                                where periodoDebito.Mes == mes && periodoDebito.Anio == anio
                                select periodoDebito.IdPeriodo).FirstOrDefault();
            return verificacion;
        }

        public List<Debito> DebitosPeriodo(int id)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == id
                          orderby debito.CodFacturacion ascending
                          select debito;
            return debitos.ToList();

        }

        public List<Debito> DebitoPrestador(decimal codPrestador, int periodo)
        {
            var debit = from debito in repositorio.Debitos
                        where debito.CodFacturacion == codPrestador && debito.IdPeriodoDebito == periodo
                        orderby debito.IdMotivoDebito ascending
                        select debito;
            return debit.ToList();
        }

        public List<Debito> DebitoPrestadorMotivo(decimal codPrestador, int periodo, int idMotivo)
        {
            var debit = from debito in repositorio.Debitos
                        where debito.CodFacturacion == codPrestador && debito.IdPeriodoDebito == periodo && debito.IdMotivoDebito == idMotivo
                        orderby debito.IdMotivoDebito ascending
                        select debito;
            return debit.ToList();
        }

        public MessageHelper AddTotales(Totale total)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Totales.InsertOnSubmit(total);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public bool VerificacionTotales(int idPeriodo)
        {
            var verificacion = (from totale in repositorio.Totales
                                where totale.IdPeriodo == idPeriodo
                                select true).FirstOrDefault();
            return verificacion;
        }

        public List<Totale> Totales(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          where totale.IdPeriodo == idPeriodo
                          select totale;
            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotales(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo
                          orderby prestador.CodFacturacion ascending
                          select new PrestadoresTotales()
                                     {
                                         CodFacturacion = (int)prestador.CodFacturacion,
                                         Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                                         Importe = totale.Importe
                                     };

            return totales.ToList();
        }

        public decimal ListaTotalesAmbulatorio(int idPeriodo)
        {
            var totales = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo && debito.idTipoDebito == 1
                          select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            return totales.Sum();
        }

        public decimal ListaTotalesInternado(int idPeriodo)
        {
            var totales = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo && debito.idTipoDebito == 2
                          select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            return totales.Sum();
        }

        public decimal ListaTotalesConsulta(int idPeriodo)
        {
            var total = from debito in repositorio.Debitos
                        where debito.IdPeriodoDebito == idPeriodo && (debito.CodPractica >= 420000 && debito.CodPractica <= 429999)
                        select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            return total.Sum();
        }

        public List<Estadistica> ListaTotalesPorMotivoDebito(int idPeriodo)
        {
            repositorio = new RepositorioDataContext();
            var lista = new List<Estadistica>();
            var estadistica1 = new Estadistica();
            var estadistica2 = new Estadistica();
            var estadistica3 = new Estadistica();
            var estadistica4 = new Estadistica();
            //Debito Automatico
            var totalDebitoAutomatico = from debito in repositorio.Debitos
                                        join motivoDebito in repositorio.MotivoDebitos on debito.IdMotivoDebito equals motivoDebito.IdMotivo
            where debito.IdPeriodoDebito == idPeriodo && motivoDebito.Tipo == "DÉBITO AUTOMATICO"
                                        select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            estadistica1.nombre = "Débito Automatico";
            try
            {
            estadistica1.Porcentaje = totalDebitoAutomatico.Sum();
            }
            catch (InvalidOperationException ex)
            {
                estadistica1.Porcentaje = 0;
            }

            lista.Add(estadistica1);

            //Debito Administrativo
            var totalDebitoAdministrativo = from debito in repositorio.Debitos
                                        join motivoDebito in repositorio.MotivoDebitos on debito.IdMotivoDebito equals motivoDebito.IdMotivo
                                            where debito.IdPeriodoDebito == idPeriodo && motivoDebito.Tipo == "DÉBITO ADMINISTRATIVO"
                                        select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            estadistica2.nombre = "Débito Administrativo";
            try
            {            
            estadistica2.Porcentaje = totalDebitoAdministrativo.Sum();
            
            }
            catch (InvalidOperationException ex)
            {

                estadistica2.Porcentaje = 0;
            }

            lista.Add(estadistica2);
            //Debito Auditoria Médica
            var totalDebitoAuditoria = from debito in repositorio.Debitos
                                            join motivoDebito in repositorio.MotivoDebitos on debito.IdMotivoDebito equals motivoDebito.IdMotivo
                                       where debito.IdPeriodoDebito == idPeriodo && motivoDebito.Tipo == "DÉBITO DE AUDITORÍA MÉDICA"
                                            select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            estadistica3.nombre = "Débito por Auditoría";
            try
            {
            estadistica3.Porcentaje = totalDebitoAuditoria.Sum();
            }
            catch (InvalidOperationException ex)
            {

                estadistica3.Porcentaje = 0;
            }
            lista.Add(estadistica3);

            //Debito que no especifica
            var totalDebitoNoEspecifica = from debito in repositorio.Debitos
                                       join motivoDebito in repositorio.MotivoDebitos on debito.IdMotivoDebito equals motivoDebito.IdMotivo
                                          where debito.IdPeriodoDebito == idPeriodo && motivoDebito.Tipo == "No Especifica"
                                       select ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
            estadistica4.nombre = "Débito Diferencia Arancel";
            try
            {
            estadistica4.Porcentaje = totalDebitoNoEspecifica.Sum();
            }
            catch (InvalidOperationException ex)
            {

                estadistica4.Porcentaje = 0;

            }

            lista.Add(estadistica4);

            return lista;

        }

        public List<PrestadoresTotales> ListaTotalesPrestador(int idPeriodo, decimal idPrestador)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && prestador.CodFacturacion == idPrestador
                          orderby prestador.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesRcia(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 5000 && totale.CodFacturacion <= 19999
                                   || totale.CodFacturacion >= 40000 && totale.CodFacturacion <= 44000)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesSP(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 20000 && totale.CodFacturacion <= 24200)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesVA(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 24554 && totale.CodFacturacion <= 26509)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesCH(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 27000 && totale.CodFacturacion <= 28999)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesQuitilipi(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 29000 && totale.CodFacturacion <= 30109)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesSM(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 30500 && totale.CodFacturacion <= 31310)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicas(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && (totale.CodFacturacion >= 31400 && totale.CodFacturacion <= 36000)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicasRcia(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo &&
                                    (totale.CodFacturacion >= 31400 && totale.CodFacturacion <= 32870 ||
                                    totale.CodFacturacion >= 35020 && totale.CodFacturacion <= 35189)
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicasSM(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo &&
                                    totale.CodFacturacion == 34654 && totale.CodFacturacion == 34685
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicasVAngela(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo &&
                                    totale.CodFacturacion == 33699 && totale.CodFacturacion == 33705
                                    && totale.CodFacturacion == 33729 && totale.CodFacturacion == 33736
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicasCharata(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo &&
                                    totale.CodFacturacion == 34104 && totale.CodFacturacion == 34111
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicasQuitilipi(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo &&
                                    totale.CodFacturacion == 34357 && totale.CodFacturacion == 34364
                                    && totale.CodFacturacion == 34425
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesClinicasSP(int idPeriodo)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo &&
                                    totale.CodFacturacion == 33019 && totale.CodFacturacion == 33033
                                    && totale.CodFacturacion == 33071 && totale.CodFacturacion == 33095
                                     && totale.CodFacturacion == 33286 && totale.CodFacturacion == 33309
                                      && totale.CodFacturacion == 33323 && totale.CodFacturacion == 33347
                                       && totale.CodFacturacion == 33378 && totale.CodFacturacion == 33422
                                        && totale.CodFacturacion == 33446
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<PrestadoresTotales> ListaTotalesMedico(int idPeriodo, int codFacturacion)
        {
            var totales = from totale in repositorio.Totales
                          join prestador in repositorio.Prestadors on totale.CodFacturacion equals
                              prestador.CodFacturacion
                          join persona in repositorio.Personas on prestador.Documento equals persona.Documento
                          where totale.IdPeriodo == idPeriodo && totale.CodFacturacion == codFacturacion
                          orderby totale.CodFacturacion ascending
                          select new PrestadoresTotales()
                          {
                              CodFacturacion = (int)prestador.CodFacturacion,
                              Denominacion = persona.Apellido + " " + (persona.Nombres ?? ""),
                              Importe = totale.Importe
                          };

            return totales.ToList();
        }

        public List<DebitoReducido> DebitosReducidosGral(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo
                          orderby debito.CodFacturacion
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };

            return debitos.ToList();

        }

        public List<DebitoReducido> DebitosReducidosRcia(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 5000 && debito.CodFacturacion <= 19999
                                   || debito.CodFacturacion >= 40000 && debito.CodFacturacion <= 44000)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosSP(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 20000 && debito.CodFacturacion <= 24200)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosVA(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 24554 && debito.CodFacturacion <= 26509)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosCH(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 27000 && debito.CodFacturacion <= 28999)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosQuitilipi(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 29000 && debito.CodFacturacion <= 30109)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosSM(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 30500 && debito.CodFacturacion <= 31310)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicas(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 31400 && debito.CodFacturacion <= 36000)

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicasRcia(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    (debito.CodFacturacion >= 31400 && debito.CodFacturacion <= 32870 ||
                                    debito.CodFacturacion >= 35020 && debito.CodFacturacion <= 35189)
                          orderby debito.CodFacturacion ascending
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicasSM(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    debito.CodFacturacion == 34654 && debito.CodFacturacion == 34685
                          orderby debito.CodFacturacion ascending
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicasVAngela(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    debito.CodFacturacion == 33699 && debito.CodFacturacion == 33705
                                    && debito.CodFacturacion == 33729 && debito.CodFacturacion == 33736
                          orderby debito.CodFacturacion ascending
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicasCharata(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    debito.CodFacturacion == 34104 && debito.CodFacturacion == 34111
                          orderby debito.CodFacturacion ascending
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicasQuitilipi(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    debito.CodFacturacion == 34357 && debito.CodFacturacion == 34364
                                    && debito.CodFacturacion == 34425
                          orderby debito.CodFacturacion ascending
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosClinicasSP(int idPeriodo)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    debito.CodFacturacion == 33019 && debito.CodFacturacion == 33033
                                    && debito.CodFacturacion == 33071 && debito.CodFacturacion == 33095
                                     && debito.CodFacturacion == 33286 && debito.CodFacturacion == 33309
                                      && debito.CodFacturacion == 33323 && debito.CodFacturacion == 33347
                                       && debito.CodFacturacion == 33378 && debito.CodFacturacion == 33422
                                        && debito.CodFacturacion == 33446
                          orderby debito.CodFacturacion ascending
                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public List<DebitoReducido> DebitosReducidosMedico(int idPeriodo, int codFacturacion)
        {
            var debitos = from debito in repositorio.Debitos
                          where debito.IdPeriodoDebito == idPeriodo &&
                                    debito.CodFacturacion == codFacturacion

                          select new DebitoReducido()
                          {
                              Documento = (int)debito.DocPaciente,
                              Paciente = debito.Paciente,
                              Practica = (int)debito.CodPractica,
                              CF = (int)debito.CantidadFacturada,
                              CA = (int)debito.CantidadPagada,
                              HonF = debito.Honorarios,
                              GtoF = debito.Gastos,
                              HonA = debito.HonAcordado,
                              GtoA = debito.GtoAcordado,
                              Observaciones = debito.Observaciones,
                              TipoDebito = debito.idTipoDebito,
                              CodFacturacion = (int)debito.CodFacturacion
                          };
            return debitos.ToList();
        }

        public MessageHelper AddTotalFacturadoPorPeriodo(TotalPorPeriodo total)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.TotalPorPeriodos.InsertOnSubmit(total);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public TotalPorPeriodo GetTotalPorPeriodoPorDefecto()
        {
            var total = (from totalPorPeriodo in repositorio.TotalPorPeriodos
                         where
                             totalPorPeriodo.idPeriodo ==
                             (from periodo in repositorio.PeriodoDebitos select periodo.IdPeriodo).Max()
                         select totalPorPeriodo).First();
            return total;
        }

        #endregion


        #region Usuario

        public MessageHelper AddUsuario(Logueo usuario)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.Logueos.InsertOnSubmit(usuario);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public MessageHelper UpdateUsuario(Logueo usuario)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var user = repositorio.Logueos.First(x => x.IdUsuario == usuario.IdUsuario);
                if (user != null)
                {
                    user.Nombre = usuario.Nombre;
                    user.Apellido = usuario.Apellido;
                    user.Password = usuario.Password;
                    user.TipoLogueo = usuario.TipoLogueo;
                    repositorio.SubmitChanges();
                }

                return new MessageHelper() { status = true, message = "Modificación exitosa." };
            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah modificado. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public Logueo GetUsuario(int idUsuario)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                var usuario = (from logueo in repositorio.Logueos
                               where logueo.IdUsuario == idUsuario
                               select logueo).FirstOrDefault();
                return usuario;
            }
            catch (Exception ex)
            {

                return null;
            }

        }

        public string GetUsuarioPass(int idUsuario)
        {
            try
            {
                repositorio = new RepositorioDataContext();

                var pass = (from User in repositorio.Logueos
                            where User.IdUsuario == idUsuario
                            select User.Password).FirstOrDefault();
                return pass;
            }
            catch (Exception ex)
            {

                return "Ha ocurrido un problema:\r\n" + ex.Message;
            };

        }

        public List<TipoLogueo> TipoUsuario()
        {
            repositorio = new RepositorioDataContext();

            var tipoLogueo = from logueo in repositorio.TipoLogueos
                             select logueo;

            return tipoLogueo.ToList();
        }

        public int GetTipoUsuario(int idUsuario)
        {
            repositorio = new RepositorioDataContext();

            var tipo = (from tipoLogueo in repositorio.Logueos
                        where tipoLogueo.IdUsuario == idUsuario
                        select tipoLogueo.IdTipoUsuario).First();
            return tipo;

        }

        public MessageHelper AddHistorialSesiones(HistorialSesione historial)
        {
            try
            {
                repositorio = new RepositorioDataContext();
                repositorio.HistorialSesiones.InsertOnSubmit(historial);
                repositorio.SubmitChanges();
                return new MessageHelper() { status = true, message = "Los datos se han sido ingresado correctamente" };
            }
            catch (Exception ex)
            {
                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah ingresado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        public HistorialSesione GetHistorialSesiones(int idUsuario, DateTime inicio, DateTime cierre)
        {
            repositorio = new RepositorioDataContext();
            var historial = (from historialSesione in repositorio.HistorialSesiones
                             where historialSesione.IdUsuario == idUsuario && historialSesione.Inicio == inicio && historialSesione.Cierre == cierre
                             select historialSesione).First();
            return historial;
        }

        public MessageHelper UpdateHistorialSesiones(HistorialSesione historial)
        {
            try
            {
                MessageHelper mensaje;
                repositorio = new RepositorioDataContext();
                var historialS = repositorio.HistorialSesiones.First(x => x.IdHistororial == historial.IdHistororial);
                if (historialS != null)
                {

                    historialS.Cierre = historial.Cierre;
                    repositorio.SubmitChanges();
                    mensaje = new MessageHelper() { status = true, message = "Los datos se han sido modificado correctamente" };
                }
                else
                {
                    mensaje = new MessageHelper() { status = false, message = "no se ha encontrado ningun registro" };
                }

                return mensaje;

            }
            catch (Exception ex)
            {

                return new MessageHelper()
                {
                    status = false,
                    message =
                        "No se ah modificado correctamente los datos, pongase en contacto con el administrador del sistema. Razon:\r\n" +
                        ex.Message
                };
            }
        }

        #endregion

    }

    public class Estadistica
    {
        public String nombre { get; set; }
        public decimal Porcentaje { get; set; }
    }
}
